package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

import educar.db.DbConnection;
import educar.db.JPA;

public class Facultad
{
    private static JPA jpa = new JPA();
    private static final String noAsignado = "-1";
    private String descripcionFacultad;
    private String codigoFacultad;

    private Facultad(String nombre, String codigo)
    {
        codigoFacultad = codigo;
        descripcionFacultad = nombre;
    }

    public Facultad(String nombre)
    {
        codigoFacultad = noAsignado;
        descripcionFacultad = nombre;
    }

    public boolean save()
    {
        String[] columns = { "codigoFacultad", "descripcionFacultad" };
        PreparedStatement stm = jpa.newRecord(DbConnection.bd + ".facultad", columns);
        try
        {
            stm.setString(1, null);
            stm.setString(2, descripcionFacultad);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return false;
        }

        jpa.create(stm);
        actualizarCodigoAlMaximo();

        return true;
    }

    public void update() throws facultadNotFound
    {
        if (codigoFacultad.compareTo(noAsignado) != 0)
            jpa.update("facultad", "descripcionFacultad", descripcionFacultad, "codigoFacultad", codigoFacultad);
        else
            throw new facultadNotFound();
    }

    //para utilizar al guardar un cargo en la base de datos
    //y obtener el codigo que le fue asignado en el objeto
    //utilizar sólo inmediatamente despues de guardar en la base de datos
    private void actualizarCodigoAlMaximo()
    {
        ResultSet rs = jpa.showMaxColumn("facultad", "codigoFacultad");
        try
        {
            if (rs.next())
            {
                this.codigoFacultad = rs.getString(1);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void destroy() throws facultadNotFound
    {
        if (codigoFacultad.compareTo(noAsignado) != 0)
            jpa.destroy("facultad", "codigoFacultad", codigoFacultad);
        else
            throw new facultadNotFound();
    }

    public static Facultad getFacultadbyName(String nombre) throws facultadNotFound
    {
        ResultSet rs = null;
        Facultad f = null;

        rs = jpa.getByField("facultad", "descripcionFacultad", nombre);

        try
        {
            if (rs.next())
            {
                f = new Facultad(rs.getString(2), rs.getString(1));
            }
            else
            {
                throw new facultadNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return f;
    }

    public static Facultad getFacultadbyId(String id) throws facultadNotFound
    {
        ResultSet rs = null;
        Facultad f = null;

        rs = jpa.getByField("facultad", "codigoFacultad", id);

        try
        {
            if (rs.next())
            {
                f = new Facultad(rs.getString(2), id);
            }
            else
            {
                throw new facultadNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return f;
    }

    public static LinkedList<Facultad> getAll()
    {
        ResultSet rs = null;
        LinkedList<Facultad> facultades = new LinkedList<Facultad>();
        rs = jpa.showAllOrderBy("facultad", "codigoFacultad");
        try
        {
            while (rs.next())
            {
                facultades.add(new Facultad(rs.getString(2), rs.getString(1)));
            }

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return facultades;
    }

    public static String[] getAllCodigosArray()
    {
        LinkedList<Facultad> l = getAll(); //TODO: pedir unicamente la columa codigoFacultad a la db
        String[] facultades = new String[l.size()];
        for (int i = 0; i < l.size(); i++)
            facultades[i] = l.get(i).toString();

        return facultades;
    }

    public String getDescripcionFacultad()
    {
        return descripcionFacultad;
    }

    public String getCodigoFacultad()
    {
        return codigoFacultad;
    }

    public void setDescripcion(String descripcion)
    {
        descripcionFacultad = descripcion;
    }

    public void setCodigo(String codigo)
    {
        codigoFacultad = codigo;
    }
    
    public String toString()
    {
    	return descripcionFacultad  + " - " + codigoFacultad;
    }
}